
#pragma region CLASS_DESCRIPTION
/*
* =========================================================================================

* AUTHOR:      Physics Core Team (Ron Ram, Matt Hoyes, Randy Prieto, Kris Greene)
* DATE:        01/17/2012
*
* CLASS:       Box2D Primitive Shape (Box2D.h)
*
* DESCRIPTION:
* ---------------------------------------------------------------------------------------
*	This is a primitive 2D box shape
*	All 2D shapes must implement all properties and behaviours described in 
*	Shape2D abstract class
* =========================================================================================
*/
#pragma endregion


#ifndef BOX2D_H_
#define BOX2D_H_


#include "Shape2D.h"


namespace Physics
{
	//Forward declaration
	class Circle2D;

	class Box2D : public Shape2D
	{
	private:
		//DATA MEMBERS...
		float width, height;
		static int bx2D_InstanceCount; //count instance objects

	public:
		//---------- CONSTRUCTORS ----------
		Box2D();																													//C001: Default Constructor
		Box2D(const float width, const float height, const Vector2 &pos);															//C002: Overloaded Constructor
		Box2D(const float width, const float height, const Vector2 &pos, const Vector2 &dir);										//C003: Overloaded Constructor
		Box2D(const float width, const float height, const Vector2 &pos, const Vector2 &dir, const float speed, const float mass);	//C004: Overloaded Constructor

		Box2D(const Box2D &box);																									//C005: Copy Constructor
		Box2D& operator=(const Box2D &box);																							//C006: Assignment Operator
		virtual ~Box2D();																											//C007: Virtual Destructor
		
		//---------- PROPERTIES ----------
		void setWidth(float width);									//M001: Setter Width
		const float getWidth() const;								//M002: Getter Width
		
		void setHeight(float height);								//M003: Setter Height
		const float getHeight() const;								//M004: Getter Height
		
		static const int count();									//M014: Getter Instance Count


		/***************************************************************
		-------------------------- IMPORTANT -------------------------- 
		***************************************************************
		In C++ pure abstract have to be re-defined in derived class
		Opposite to C# style of coding
		****************************************************************/


#pragma region IPhysicsObject_Re-DEFINE_METHODs_AGAIN
		//
		void Info();												//M015: Print Summary Info about instance object
#pragma endregion


#pragma region ICollision2D_Re-DEFINE_METHODS_AGAIN
		//COLLISION_2D
		bool collision(const Box2D& box);							//M005: THIS -> Box2D collision check
		bool collision(const Circle2D& circle);						//M006: THIS -> Circle2D collision check
#pragma endregion

		
#pragma region Shape2D_Re-DEFINE_METHODS_AGAIN
		//CENTER_LOCATION
		const Vector2 getCenter() const;							//M007: Getter Center
		
		//ROTATION_2D
		void rotateInDegs(const float degrees);						//M008: Rotate 2D shape using degrees
		void rotateInRads(const float radians);						//M009: Rotate 2D shape using radians

		//TRANSLATION_POSITION
		void translatePosition(const float X, const float Y);		//M010: Translate position using floats
		void translatePosition(const Vector2 &value);				//M011: Translate position using Vector2

		//TRANSLATION_DIRECTION
		void translateDirection(const float X, const float Y);		//M012: Translate direction using floats
		void translateDirection(const Vector2 &value);				//M013: Translate direction using Vector2
#pragma endregion

	};
} /* NAMESPACE */

#endif